﻿#define _CRT_SECURE_NO_WARNINGS 1
//练习
//1. 计算 n的阶乘。
//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);//n这个数必须是个具体的数，所以我们必须输入一个具体的值
//	int i= 0;
//	int ret = 1;
//		for (i = 1; i <= n; i++)
//		{
//			ret = ret * i;//产生n的阶乘
//		}
//		printf("%d", ret);
//	return 0;
//}


/*///2. 计算 1!+ 2!+ 3!+ …… + 10!
#include<stdio.h>
int main()
{
	int i = 0;
	int ret = 1;
	int j = 0;
	int sum = 0;
	for (j = 1; j <= 10; j++)
	{
		ret = 1;
		for (i = 1; i <= j; i++)
		{
			ret = ret * i;
		}
		sum = sum + ret;
	}
	printf("%d", sum);
	return 0;
}*/

//
//#include<stdio.h>
//int main()
//{
//
//	int i= 0;
//	int ret = 1;
//	int sum = 0;
//		for (i = 1; i <= 10; i++)
//		{
//			ret = ret * i;
//			sum = sum + ret;
//		}
//		printf("%d", sum);
//	return 0;
//}
////在前一个数的阶乘基础上乘上当前的数字，提高效率
//1！=1*1
//2！=1*1*2
//3！=1*1*2*3
//4！=1*1*2*3*4







//3. 在一个有序数组中查找具体的某个数字n。 
// 编写int binsearch(int x, int v[], int n); 
// 功能：在v[0]<= v[1] <= v[2] <= …. <= v[n - 1]的数组中查找x


//第一种方法——遍历
//有序数组
//数组下标
//效率低
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//创建数组的时候就分配好空间大小了，且装满了，只是初始化有时候可能没写满。没有的部分为\0
//	                                     //数组如果初始化，就可以不指定大小，编译器根据初始化内容确定数组大小
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值
//	int i = 0;
//	int flag = 0;//flag为假
//	for (i = 0; i <= 9; i++)
//	{
//		if (arr[i] == k)//易错：：：赋值和相等
//		{
//			printf("找到了，下标为：%d\n", i);
//			flag = 1;//找到变成真的
//			break;   //找到就不用再循环了，在所有都遍历的情况上提高效率
//		}
//	}
//	if (flag == 0)//遍历了全部还是没找到
//		printf("没找到");
//	return 0;
//}

//
//
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//创建数组的时候就分配好空间大小了，且装满了，只是初始化有时候可能没写满。没有的部分为\0
//	                                     //数组如果初始化，就可以不指定大小，编译器根据初始化内容确定数组大小
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值
//	int i = 0;
//	int flag = 0;//flag为假
//	for (i = 0; i <= 9; i++)
//	{
//		if (arr[i] == k)//易错：：：赋值和相等
//		{
//			printf("找到了，下标为：%d\n", i);
//			break;   //找到就不用再循环了，在所有都遍历的情况上提高效率
//		}
//		else
//		{
//			printf("没找到");//不可行的
//		}
//	}
//	return 0;
//}






////数组中元素的个数的计算sizeof
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("数组的空间大小：%d\n", sizeof(arr));
//	printf("数组中1个元素的大小：%d\n", sizeof(arr[7]));
//	printf("数组中有多少个元素：%d\n", sizeof(arr)/sizeof(arr[7]));
//}


////第二种
////折半查找——二分查找
////分清楚下标和数组数字
////效率高 有序数组 不一定连续
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int size = sizeof(arr) / sizeof(arr[0]);//就算数组的元素的个数
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值
//	int flag = 0;
//	int left = 0;
//	int right = size-1;//设置左右下标
//	//分支
//	while (left <= right)
//	{
//		int mid = (left + right)/2;
//		if (arr[mid] < k)
//			left = mid + 1;
//		else if (arr[mid] > k)
//			right = mid - 1;
//		else
//		{
//			printf("找到了,下标是%d\n",mid);
//			flag = 1;//必须要设置flag
//			break;
//		}
//    }//循环体只是一次二分查找
//	if (flag == 0)//注意不是flag=0，赋值🆗
//		printf("没找到\n");
//	return 0;
//}





////数组中元素的个数的计算sizeof
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("数组的空间大小：%d\n", sizeof(arr));
//	printf("数组中1个元素的大小：%d\n", sizeof(arr[7]));
//	printf("数组中有多少个元素：%d\n", sizeof(arr)/sizeof(arr[7]));
//}
////数组中元素的计算字符串sizeof和strlen
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[] = "a,b,c";
//	printf("数组中元素的个数：%d\n", sizeof(arr) / sizeof(arr[0]));
//	printf("数组中最右元素的下标：%d\n", sizeof(arr) / sizeof(arr[0]) - 2);
//	//-2指的是下标从0开始和减去"\0"
//	printf("数组中元素的个数：%d\n", strlen(arr));
//	//strlen是不计算"\0"的，需要包含头文件#include<string.h>
//	printf("数组中最右元素的下标：%d\n", strlen(arr) - 1);
//	//所以只要-1就是指的是下标从0开始
//	return 0;
//}


//4. 编写代码，演示多个字符从两端移动，向中间汇聚。
// #include<stdio.h>
//#include<windows.h>
//int main()
//{
//	char arr1[] = "hello   word    tsq!!!!!!" ;//无{}
//	char arr2[] = "*************************" ;
//	int left = 0;
//	int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
//	while (left <= right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		/*arr1[left]=arr2[left];
//		arr1[right]=arr2[right];*/
//		printf("%s\n",arr2);
//		Sleep(2000);
//		system("cls");//清空屏幕
//		left++;//变化循环
//		right--;
//	}
//	printf("%s\n", arr2);
//	return 0;
//}

//Sleep
//system("cls")//只是清空屏幕上的缓存










//映入一个函数strcmp
		//strcmp函数是比较字符串的大小的
		// strcmp 函数的返回值
		// >  >0
		// == <0
		// <  <0
		//实质：不是比较字符串的大小  比较的是内容——起始地址
		//包含头文件#include<string.h>
//5. 编写代码实现，模拟用户登录情景，并且只能登录三次。（只允许输入三次密码，如果密码正确则
//提示登录成，如果三次均输入错误，则退出程序。
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	int i = 0;
//	char ch[20] = { 0 };
//	int flag = 0;
//	for(i = 1; i <= 3; i++)
//	{
//		printf("请输入密码：\n");
//		scanf("%s", &ch);
//		//if (ch == "123456")//两个字符串判断相等一定不能用“==”🆗？
//		if(strcmp(ch,"123456") == 0)
//		{
//			printf("登录成功\n");
//			flag = 1;
//			break;
//		}
//		else
//		{
//			printf("密码错误\n");
//		}
//	}
//	if(flag == 0)
//	printf("退出程序\n");
//	return 0;
//}


//
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	char ch[20] = { 0 };
//	int flag = 0;
//	for (i = 0; i < 3; i++)//边界条件很重要
//	{
//		printf("请输入密码：\n");
//		scanf("%s", &ch);
//		if(strcmp(ch,"123456") == 0)
//		{
//			printf("登录成功\n");
//			break;
//		}
//		else
//		{
//			printf("密码错误\n");
//		}
//	}
//	if (i == 3)//关于“=”和“==”的区别也很重要
//		printf("退出程序\n");
//	return 0;
//}




//7.关机程序
//程序运行起来：3分钟内关机
//如果输入  我是猪，取消关机
//#include<stdio.h>
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 180");//开始倒计时关机
//	//命令是关机
//again:
//	printf("开始关机倒计时，请输入：我是猪，取消关机\n");
//	scanf("%s", &input);
//	if (strcmp(input, "我是猪") == 0)
//	{
//		system("shutdown -a");
//		//取消关机的命令
//		printf("已经取消关机\n");
//	}
//	else
//	{
//		goto again;
//	}
//	return 0;
//}

//
//#include<stdio.h>
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 180");//开始倒计时关机
//	//命令是关机
//
//	
//	while (1)
//	{
//		printf("开始关机倒计时，请输入：我是猪，取消关机\n");
//		scanf("%s", &input);
//		if (strcmp(input, "我是猪") == 0)
//		{
//			system("shutdown -a");
//			//取消关机的命令
//			printf("已经取消关机\n");
//			break;
//		}
//	}
//	return 0;
//}



//6.猜数字游戏的实现
//电脑随机生成一个1~100之间的数字
//给玩家一个菜单/玩游戏输入1/不玩游戏0/输入其他数字请重新选择
//##随机数怎样去生成
//开始游戏
//猜小了——提示猜小了
//猜大了——提示猜大了
//猜中了——恭喜，猜中了，游戏结束





//void menu()
//{
//	printf("***********************\n");
//	printf("********Play.1*********\n");
//	printf("********Over.0*********\n");
//	printf("***********************\n");
//}
//#include<stdio.h>
//int main()
//{
//	//实现选择
//	int input = 0;
//	do
//	{
//		printf("游戏选择如下:\n");
//		menu();//设置一个游戏菜单函数
//		printf("请玩家选择:\n");
//		scanf("%d", &input);
//		if (input == 1)
//			printf("进入游戏\n");
//		else if (input == 0)
//			printf("游戏结束\n");
//		else
//			printf("输入错误，请重新输入\n");
//
//	} while (input);
//	//input=1或其他（只要是非0）都是表达式为真，进入循环
//	//input为0 表达式为假，跳出循环
//	return 0;
//}


//
//
//生成随机数rand()函数
//rand函数生成的伪随机数
//rand函数生成的随机数的范围是：0~RAND_MAX(32767)
//rand函数在生成随机数之前，要使用srand函数设置随机数的随机数生成器








//srand需要的头文件     #inlcude<stdlib.h>
//srand(x);  x是随机数生成器的种子，种子不一样则生成的随机数不一样
// void srand (unsigned int seed);
// 根据种子+算法=生成随机数
//陷入了一个问题：为了生成随机数，我们有要创造一个随机数的种子？？？？
//只要这个种子是一个随机值就🆗了
//我们这里就要引入time函数了
//




//time()函数需要的头文件#include<time.h>
//时间戳
// 简单来说：就是时间和数字之间的转换。
// 当前计算机的时间相较于计算机的起始时间之间的差值
//Unix 时间戳是从1970年1月1日（UTC/GMT的午夜）开始所经过的秒数，不考虑闰秒。
//time（）函数——可以返回一个时间戳
// time_t time (time_t* timer);
// 返回值时间         参数是一个指针
// 在time（NULL）——NULL空指针实际上就是0
// time函数的返回值是time_t
// 但是我们srand需要的返回值值unsigned int 类型        // void srand (unsigned int seed);
// 这里我们需要强制转换把time_t转换称unsigned int
// ------------(unsigned int)time(NULL）


//生成随机数
//#include<stdlib.h>
//#include<time.h>
//#include<stdio.h>
//int main()
//{
//	srand((unsigned int)time(NULL));
//	int ret = rand();
//	printf("%d", ret);
//	return 0;
//}
//












#include<stdlib.h>
#include<time.h>
#include<stdio.h>
void menu()
{
	printf("***********************\n");
	printf("********Play.1*********\n");
	printf("********Over.0*********\n");
	printf("***********************\n");
}
void game()//游戏逻辑的实现
{
	
	int ret = rand()%100+1;//取模得到余数1~99之间+1就是1~100之间的随机数
	int guess = 0;
	
	while (1)//如果不跳出去，永远死循环循环
	{
		printf("请输入你猜测的数字：\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你猜中了！\n");
			break;
		}
	}
}
#include<stdio.h>
int main()
{
	//实现选择
	int input = 0;
	srand((unsigned int)time(NULL));
	//srand不需要频繁调用，只用调用一次即可
	do
	{
		printf("游戏选择如下:\n");
		menu();//设置一个游戏菜单函数
		printf("请玩家选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		    case(1):
				printf("进入游戏\n");
				game();//实现游戏逻辑
				break;
			case(0):
				printf("游戏结束\n");
				break;
			default:
				printf("输入错误，请重新输入\n");
				break;
		}
	} while (input);
	//input=1或其他（只要是非0）都是表达式为真，进入循环
	//input为0 表达式为假，跳出循环
	return 0;
}
